package com.example.homework2

import org.apache.spark.graphx.{Edge, Graph, VertexId}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author lbq
 * @date 2022/2/21 19:47
 * @version 1.0
 */
object AirportGraphx {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName(this.getClass.getCanonicalName)
    val sc: SparkContext = new SparkContext(conf)
    sc.setLogLevel("warn")
    // 定义顶点
    val vertexArray: Array[(VertexId, String)] = Array((1, "SFO"), (2, "ORD"), (3, "DFW"))
    // 定义边
    val edgeArray: Array[Edge[Int]] = Array(Edge(1L, 2L, 1800), Edge(2L, 3L, 800), Edge(3L, 1L, 1400))

    // 构造vertexRDD和edgeRDD
    val vertexRDD: RDD[(VertexId, String)] = sc.makeRDD(vertexArray)
    val edgeRDD: RDD[Edge[Int]] = sc.makeRDD(edgeArray)

    // 构造图Graph[VD,ED]
    val graph: Graph[String, Int] = Graph(vertexRDD, edgeRDD)

    // 求所有的顶点
    graph.vertices.foreach(println)
    println("***************************************************")
    // 求所有的边
    graph.edges.foreach(println)
    println("***************************************************")
    // 求所有的triplets
    graph.triplets.foreach(println)
    println("***************************************************")
    // 求顶点数
    println(s"顶点数: ${graph.vertices.count()}")
    println("***************************************************")
    // 求边数
    println(s"边数: ${graph.edges.count()}")
    println("***************************************************")
    // 求机场距离大于1000的有几个，有哪些按所有机场之间的距离排序（降序），输出结果
    graph.triplets.filter(_.attr > 1000).sortBy(_.attr, false).foreach(println)

    sc.stop()
  }
}
